package com.ishowcode.aspect;
import com.ishowcode.annotation.GlobalInterceptor;
import com.ishowcode.entity.ResultCode;
import com.ishowcode.utils.BizException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.regex.Pattern;
@Aspect
@Component("GlobalOperationAspect")
public class GlobalOperationAspect {
    @Pointcut("@annotation(com.ishowcode.annotation.GlobalInterceptor)")
    public void requestInterceptor(){}
    @Resource
    RedisTemplate<String,Object> redisTemplate;
    @Before("requestInterceptor()")
    public void interceptorDo(JoinPoint joinPoint) throws NoSuchMethodException {
        Object target = joinPoint.getTarget();
        String name = joinPoint.getSignature().getName();
        Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();
        Method method = target.getClass().getMethod(name, parameterTypes);
        GlobalInterceptor interceptor = method.getAnnotation(GlobalInterceptor.class);
        if (interceptor.checkLogin()){
            checkLogin(joinPoint);
        }
        if (interceptor.checkParam()){
            checkParam(joinPoint);
        }
        if (interceptor.checkAdmin()){
            checkAdmin(joinPoint);
        }
    }
    public void checkLogin(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        if (null==redisTemplate.opsForValue().get("user--"+args[0])){
            BizException bizException = new BizException();
            bizException.setR(ResultCode.SERVER_LOGIN_ERROR);
            throw bizException;
        }

    }
    public void checkAdmin(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        if (!"3010266295@qq.com".equals(args[0])){
            BizException bizException = new BizException();
            bizException.setR(ResultCode.Admin_ERROR);
            throw bizException;
        }

    }
    public void checkParam(JoinPoint joinPoint) {
        String email = "email";
        String code = "code";
        String password = "password";
        String nickname = "nickname";
        String oldemail = "oldemail";
        String newemail = "newemail";
        Object[] args = joinPoint.getArgs();
        String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames();
        for (int i = 0; i <args.length ; i++) {
            if (argNames[i].equals(email)||argNames[i].equals(oldemail)||argNames[i].equals(newemail)){
                String emailcheck = (String) args[i];
                boolean matches = Pattern.matches("^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$", emailcheck);
                if (!matches){
                    BizException bizException = new BizException();
                    bizException.setR(ResultCode.Email_Error);
                    throw bizException;
                }
            }
            if (argNames[i].equals(code)){
                String codecheck = args[i]+"";
                boolean match = Pattern.matches("^\\d{6}$",codecheck);
                if (!match){
                    BizException bizException = new BizException();
                    bizException.setR(ResultCode.CODE_ERROR);
                    throw bizException;
                }
            }
            if (argNames[i].equals(password)){
                String passcheck = (String) args[i];
                boolean match = Pattern.matches("^[a-zA-Z]\\w{5,17}$",passcheck);
                if (!match){
                    BizException bizException = new BizException();
                    bizException.setR(ResultCode.PassWord_Error);
                    throw bizException;
                }
            }
            if (argNames[i].equals(nickname)){
                String nicknamecheck = (String) args[i];
                if (nicknamecheck.equals("")){
                    BizException bizException = new BizException();
                    bizException.setR(ResultCode.Nick_Name_Error);
                    throw bizException;
                }
            }
        }
    }

}



//验证数字的正则表达式集
//        验证数字：^[0-9]*$
//        验证n位的数字：^\d{n}$
//        验证至少n位数字：^\d{n,}$
//        验证m-n位的数字：^\d{m,n}$
//        验证零和非零开头的数字：^(0|[1-9][0-9]*)$
//        验证有两位小数的正实数：^[0-9]+(.[0-9]{2})?$
//        验证有1-3位小数的正实数：^[0-9]+(.[0-9]{1,3})?$
//        验证非零的正整数：^\+?[1-9][0-9]*$
//        验证非零的负整数：^\-[1-9][0-9]*$
//        验证非负整数（正整数 + 0） ^\d+$
//        验证非正整数（负整数 + 0） ^((-\d+)|(0+))$
//        验证长度为3的字符：^.{3}$
//        验证由26个英文字母组成的字符串：^[A-Za-z]+$
//        验证由26个大写英文字母组成的字符串：^[A-Z]+$
//        验证由26个小写英文字母组成的字符串：^[a-z]+$
//        验证由数字和26个英文字母组成的字符串：^[A-Za-z0-9]+$
//        验证由数字、26个英文字母或者下划线组成的字符串：^\w+$
//        验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为：以字母开头，长度在6-18之间，只能包含字符、数字和下划线。
//        验证是否含有 ^%&',;=?$\" 等字符：[^%&',;=?$\x22]+
//        验证汉字：^[\u4e00-\u9fa5],{0,}$
//        验证Email地址：^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
//        验证InternetURL：^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ；^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
//        验证电话号码：^(\d3,4
//        \d
//        3
//        ,
//        4
//        |\d{3,4}-)?\d{7,8}$：--正确格式为：XXXX-XXXXXXX，XXXX-XXXXXXXX，XXX-XXXXXXX，XXX-XXXXXXXX，XXXXXXX，XXXXXXXX。
//        验证身份证号（15位或18位数字）：^\d{15}|\d{}18$
//        验证一年的12个月：^(0?[1-9]|1[0-2])$ 正确格式为：“01”-“09”和“1”“12”
//        验证一个月的31天：^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为：01、09和1、31。
//        整数：^-?\d+$
//        非负浮点数（正浮点数 + 0）：^\d+(\.\d+)?$
//        正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
//        非正浮点数（负浮点数 + 0） ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
//        负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
//        浮点数 ^(-?\d+)(\.\d+)?$
